Skip to content

feat(transport): Add EnvelopePrinterTransport for debug logging#6181

Merged
ericapisani merged 14 commits intomasterfrom
envelope-printer-transport-zcgvd
May 8, 2026
Merged

feat(transport): Add EnvelopePrinterTransport for debug logging#6181
ericapisani merged 14 commits intomasterfrom
envelope-printer-transport-zcgvd

Conversation

@ericapisani
Copy link
Copy Markdown
Member

@ericapisani ericapisani commented May 1, 2026

Adds EnvelopePrinterTransport, a decorator transport that wraps the real transport and pretty-prints each envelope's headers and item payloads to the SDK debug logger before forwarding the envelope.

Enabled via SENTRY_PRINT_ENVELOPES=1 (also accepts true/yes). When unset or falsy, no wrapping occurs and there's no runtime cost. Useful for local debugging without having to run a local Sentry instance or intercept network traffic.

Fixes PY-2398
Fixes #6183

ericapisani and others added 2 commits May 1, 2026 10:38
Add a decorator transport that logs envelope contents via the SDK
debug logger before forwarding to the inner transport. Activated by
setting SENTRY_PRINT_ENVELOPES=1|true|yes.

Includes tests for delegation, logging behavior, make_transport
integration, and strict env var parsing.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented May 1, 2026

Codecov Results 📊

13 passed | Total: 13 | Pass Rate: 100% | Execution Time: 6.90s

📊 Comparison with Base Branch

Metric Change
Total Tests
Passed Tests
Failed Tests
Skipped Tests

✨ No test changes detected

All tests are passing successfully.

❌ Patch coverage is 40.68%. Project has 15136 uncovered lines.
✅ Project coverage is 31.3%. Comparing base (base) to head (head).

Files with missing lines (1)
File Patch % Lines
transport.py 25.26% ⚠️ 438 Missing and 7 partials
Coverage diff
@@            Coverage Diff             @@
##          main       #PR       +/-##
==========================================
+ Coverage    31.29%    31.30%    +0.01%
==========================================
  Files          190       190         —
  Lines        21985     22032       +47
  Branches      7394      7400        +6
==========================================
+ Hits          6880      6896       +16
- Misses       15105     15136       +31
- Partials       581       583        +2

Generated by Codecov Action

@linear-code
Copy link
Copy Markdown

linear-code Bot commented May 1, 2026

@ericapisani
Copy link
Copy Markdown
Member Author

bugbot run

@ericapisani
Copy link
Copy Markdown
Member Author

@sentry review

Comment thread sentry_sdk/transport.py
Comment thread sentry_sdk/transport.py
Comment thread sentry_sdk/transport.py Outdated
…sport coverage

- Override __class__ to delegate to inner transport so isinstance checks
  (e.g. AsyncHttpTransport) remain transparent
- Add __getattr__ fallback for attributes not explicitly defined
- Return values from flush() and kill() so async tasks propagate
- Wrap transport in all make_transport paths (pre-instantiated, callable)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
@ericapisani
Copy link
Copy Markdown
Member Author

bugbot run

@ericapisani
Copy link
Copy Markdown
Member Author

@sentry review

Comment thread sentry_sdk/transport.py
Copy link
Copy Markdown

@cursor cursor Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

✅ Bugbot reviewed your changes and found no new issues!

Comment @cursor review or bugbot run to trigger another review on this PR

Reviewed by Cursor Bugbot for commit f050b85. Configure here.

Comment thread sentry_sdk/transport.py Outdated
@ericapisani ericapisani marked this pull request as ready for review May 4, 2026 14:51
@ericapisani ericapisani requested a review from a team as a code owner May 4, 2026 14:51
Comment thread sentry_sdk/transport.py
Copy link
Copy Markdown
Contributor

@alexander-alderman-webb alexander-alderman-webb left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The snippet below should probably work without crashing, since that's the canonical way to provide an alternative transport.

Maybe we create a transport which only prints to the terminal without wrapping another transport?

import sentry_sdk
from sentry_sdk.transport import _EnvelopePrinterTransport
sentry_sdk.init(
    dsn="...",
    transport=_EnvelopePrinterTransport,
)

@ericapisani
Copy link
Copy Markdown
Member Author

@alexander-alderman-webb Given this transport is for debugging purposes on our end, I opted for the wrapping approach so that we don't need to change how we've configured the SDK, which was intended to include specific transports we may be leveraging for our use case.

Is there something in particular that you're concerned about with this approach?

@alexander-alderman-webb
Copy link
Copy Markdown
Contributor

My main concern is that we need to set debug=True to see the envelopes with this approach (otherwise the logs are filtered out).
A smaller concern is that we will have to update the transport when we add new methods to the interface defined by the Transport base class. Ideally the new transport would be no maintenance effort at all 😄.

I agree that wrapping would be the nicest approach but I don't think our current abstractions were designed for this kind of wrapping 😞.

Comment thread sentry_sdk/transport.py
Comment thread sentry_sdk/transport.py
)
logger.debug("--- End Envelope ---")
except Exception:
pass
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Silent exception swallowing hides debug tool failures

Low Severity

The bare except Exception: pass in capture_envelope silently swallows all errors during envelope printing without any feedback. Since this is specifically a debugging tool activated by SENTRY_PRINT_ENVELOPES=1, silently failing defeats the tool's purpose — a developer who enables it and sees no output would have no way to know why. The SDK's own capture_internal_exceptions pattern logs exceptions rather than discarding them entirely.

Fix in Cursor Fix in Web

Reviewed by Cursor Bugbot for commit 8d69e7b. Configure here.

Comment thread sentry_sdk/transport.py Outdated
Comment thread tests/test_transport.py Outdated
Comment thread sentry_sdk/transport.py Outdated
Comment thread sentry_sdk/transport.py
Comment thread sentry_sdk/transport.py Outdated
Copy link
Copy Markdown

@cursor cursor Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cursor Bugbot has reviewed your changes and found 1 potential issue.

There are 3 total unresolved issues (including 2 from previous reviews).

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit 5205418. Configure here.

Comment thread sentry_sdk/transport.py
Revert "Do not require a DSN to be set to use the envelope pretty print transport"

This reverts commit 5205418.
…move the need to set the debug property in the sentry client when the env var controlling this is set
Copy link
Copy Markdown
Contributor

@alexander-alderman-webb alexander-alderman-webb left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks good! I ran a simple example and can confirm that envelopes appear in the terminal.

Thanks for making the changes!

Comment thread tests/test_transport.py
isolation_scope,
get_isolation_scope,
Hub,
isolation_scope,
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Probably best to remove the changes in test_transport.py since we're not adding any tests. Although it's only import ordering so this is a nitpick.

Comment thread sentry_sdk/transport.py Outdated
@ericapisani ericapisani merged commit 78e98b6 into master May 8, 2026
151 checks passed
@ericapisani ericapisani deleted the envelope-printer-transport-zcgvd branch May 8, 2026 16:53
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Add transport for pretty-printing envelope contents when debugging span-first logic

2 participants